    Public Function SetPassword(ByVal User As String, _
             ByVal Password As String) As String
      ' Cel  Ta funkcja suy do kodowania acucha hasa wprowadzonego
      '      przez uytkownika. Na pocztku acucha dodawane s cztery 
      '      znaki numeryczne, po ktrych nastpuj znaki samego hasa.
      '      Kady znak jest obliczany jako znak modulo 26
      '		plus dugo hasa.
      '
      ' Lista argumentw:
      '  Password   acuch, ktry zawiera haso
      '  User       Nazwa uytkownika
      '
      ' Zwracana warto:
      '  string      Zakodowane haso
      '
      Check = CreateChecksum(User)
      EncodedPW = EncodePassword(Password, Check)
      SetPassword = EncodedPW
    End Function

    Public Function GetSecurityLevel(ByVal User As String) As Integer
      ' Cel	Ta procedura suy do pobierania poziomu bezpieczestwa
      '      	uytkownika.
      '
      ' Lista argumentw:
      '  User     Uytkownik dla tego hasa
      '
      ' Zwracana warto:
      '  integer   Poziom bezpieczestwa uytkownika. Zwraca 0,
      '         	jeli uytkownik nie zostanie znaleziony
      '
      Dim i As Integer

      For i = 0 To mUserCount - 1
        If UCase(mUserList(i).User) = UCase(User) Then
          Return mUserList(i).SecurityLevel
        End If
      Next i
      Return 0

    End Function

    Public Function CheckPassword(ByVal User As String, _
             ByVal Password As String) As Integer
      ' Cel	Ta procedura suy do sprawdzania, czy haso zgadza si
      '      z hasem uytkownika.
      '
      ' Lista argumentw:
      '  User     Uytkownik dla tego hasa
      '  Password acuch, ktry zawiera haso
      '
      ' Zwracana warto:
      '  integer  -1 jeli podane jest prawidowe haso,
      '       	     0 w innym przypadku 
      '
      Dim i As Integer

      For i = 0 To mUserCount - 1
        If UCase(mUserList(i).User) = UCase(User) Then
          If UCase(mUserList(i).Pass) = UCase(Password) Then
            Return -1   ' Zgadza si
          End If
        End If
      Next i
      Return 0     ' Nie zgadza si

    End Function
    Public Function GetPassword(ByVal User As String, _
             ByVal Password As String) As String
      ' Cel  Ta procedura suy do sprawdzania, czy podane haso  
      '      jest prawidowe dla danego uytkownika. 

      ' **********  Teraz sprawdzamy kodowanie
      ' **********  i dekodowanie.
      '
      ' Lista argumentw:
      '  User     Uytkownik dla tego hasa
      '  Password   acuch, ktry zawiera haso
      '
      ' Zwracana warto:
      '  string    Zdekodowane haso
      '         W innym przypadku pusty acuch
      '
      Dim Temp As String, OriginalPW As String

      OriginalPW = Password
      Check = CreateChecksum(User)
      EncodedPW = EncodePassword(Password, Check)

      Temp = DecodePassword(EncodedPW, Check)

      If UCase(Temp) = UCase(OriginalPW) Then
        Return Temp   ' Pasuje
      Else
        Return ""     ' Nie pasuje
      End If

    End Function

    ' ================= Funkcje pomocnicze ======================

    Private Function DecodePassword(ByVal password As String, _
              ByVal Check As Integer) As String
      ' Cel  Ta procedura suy do dekodowania hasa. 
      '      Ma dziaanie odwrotne do kodowania.
      ' Lista argumentw:
      '  password haso
      '  Check    suma kontrolna dla hasa
      '
      ' Return Value:
      '  string   zdekodowane haso
      '
      Dim i As Integer
      Dim length As Integer
      Dim s As String, w As String

      For i = 0 To 3
        s &= Chr(Asc(password.Substring(i, 1)) - 26)
      Next i
      length = CInt(s.Substring(0, 2)) ' Dugo hasa to 2 pierwsze znaki
      Check = CInt(s.Substring(2, 2)) ' Nastpne dwa znaki to suma kontrolna 
      w = ""
      For i = 4 To length + 3
        w = w + Chr(Asc(password.Substring(i, 1)) - Check)
      Next i
      DecodePassword = w

    End Function

    Private Function EncodePassword(ByVal Password As String, _
              ByVal Check As Integer) As String
      ' Cel  Ta funkcja suy do kodowania acucha hasa wprowadzonego
      '      przez uytkownika. Na pocztku acucha dodawane s cztery 
      '      znaki numeryczne, po ktrych nastpuj znaki samego hasa.
      '      Kady znak jest obliczany jako znak modulo 26
      '      plus dugo hasa.

      ' Parametry:
      '  Password   haso do zakodowania
      '  Check   suma kontrolna dla hasa
      '
      ' Zwracana warto:
      '  acuch zakodowanego hasa
      '
      Dim s, cs, d, buff As String
      Dim Temp, i, length As Integer

      d = Format$(Len(Password), "00")
      s = Format$(Check, "00")
      buff = d & s

      cs = ""
      For i = 0 To 3      ' Formatuje dugo i sum kontroln do hasa
        Temp = Asc(buff.Substring(i, 1)) + 26
        cs &= Format$(Chr(Temp))
      Next i

      d = ""
      For i = 0 To Len(Password) - 1 ' Koduje samo haso przy uyciu 
                                     ' sumy kontrolnej
        Temp = Asc(Password.Substring(i, 1)) + Check
        d = d & Chr(Temp)
      Next i

      s = d
      Randomize()
      For i = Len(d) To MAXLENGTH - 4 ' Wypenia reszt znakami losowymi 
        Temp = 0
        Do While Temp < 32 Or Temp > 127
          Temp = CInt(Rnd()) * 127
        Loop
        s = s & Chr(Temp)
      Next i

      Password = cs & s       ' Skada razem kawaki
      EncodePassword = Password

    End Function
